package com.zy.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zy.bean.bo.version.VersionUpdateBo;
import com.zy.bean.po.VersionList;
import com.zy.bean.vo.VersionVo;
import com.zy.mapper.VersionListMapper;
import com.zy.service.VersionListService;
import com.zy.util.SnowflakeIdWorker;
import com.zy.util.UserUtil;
import com.zy.util.VersionCompareUtil;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;

import java.util.LinkedList;
import java.util.List;

/**
 * @author hanhuafeng
 * @createDate 2023-05-31 15:37:37
 * @description 项目版本列表
 */
@Service
@RequiredArgsConstructor
public class VersionListServiceImpl extends ServiceImpl<VersionListMapper, VersionList>
        implements VersionListService {
    private final UserUtil userUtil;

    /**
     * 创建一个版本号
     *
     * @param versionName 版本名称
     * @param projectCode 项目code
     * @return 版本号
     */
    @Override
    public String createVersion(String versionName, String projectCode) {
        return createVersion(versionName, null, projectCode);
    }

    /**
     * 创建版本号
     *
     * @param versionName 版本名称
     * @param desc        版本描述
     * @param projectCode 项目code
     * @return 版本号
     */
    @Override
    public String createVersion(String versionName, String desc, String projectCode) {
        // 校验版本信息
        checkVersionEffective(versionName, projectCode);
        String code = SnowflakeIdWorker.getUuid();
        VersionList versionList = new VersionList();
        versionList.setCode(code);
        versionList.setName(versionName);
        versionList.setCreateUserId(userUtil.getUserCode());
        versionList.setIntroduce(desc);
        versionList.setChartCode(projectCode);
        this.save(versionList);
        return code;
    }

    /**
     * 校验版本号是否有效
     *
     * @param targetVersion 目标版本号
     * @param chartCode     流程图code
     */
    private void checkVersionEffective(String targetVersion, String chartCode) {
        if (ObjectUtils.isEmpty(targetVersion)) {
            throw new IllegalArgumentException("版本号不能为空");
        }
        if (ObjectUtils.isEmpty(chartCode)) {
            throw new IllegalArgumentException("流程图code不能为空");
        }
        // 取项目的最后一个版本号
        VersionList versionList = this.lambdaQuery()
                .eq(VersionList::getChartCode, chartCode)
                .orderByDesc(VersionList::getCreateTime)
                .last("limit 1")
                .one();
        if (ObjectUtils.isNotEmpty(versionList)) {
            if (versionList.getCode().equals(targetVersion)) {
                throw new IllegalArgumentException("当前版本号已存在");
            }
            if (VersionCompareUtil.compareVersion(versionList.getCode(), targetVersion)) {
                throw new IllegalArgumentException("当前版本号不能小于等于最后一个版本号");
            }
        }
    }

    /**
     * 根据版本号获取版本信息
     *
     * @param versionCode 版本号
     * @return VersionVo 版本信息
     */
    @Override
    public VersionVo getVersionByCode(String versionCode) {
        if (ObjectUtils.isEmpty(versionCode)) {
            throw new IllegalArgumentException("版本号不能为空");
        }
        VersionList version = this.lambdaQuery().eq(VersionList::getCode, versionCode).one();
        if (ObjectUtils.isEmpty(version)) {
            throw new RuntimeException(versionCode + "对应的版本信息不存在");
        }
        return new VersionVo(version);
    }

    /**
     * 根据项目code获取版本列表
     *
     * @param chartCode 流程图code
     * @return List<VersionVo> 版本列表
     */
    @Override
    public List<VersionVo> getVersionListByProjectCode(String chartCode) {
        List<VersionVo> result = new LinkedList<>();
        List<VersionList> versionList = this.lambdaQuery().eq(VersionList::getChartCode, chartCode).list();
        if (ObjectUtils.isEmpty(versionList)) {
            return result;
        }
        versionList.forEach(version -> result.add(new VersionVo(version)));
        return result;
    }

    /**
     * 根据版本号删除版本信息
     *
     * @param chartCodeList 流程图code
     */
    @Override
    public void deleteVersionByChartCode(List<String> chartCodeList) {
        if (ObjectUtils.isEmpty(chartCodeList)) {
            throw new IllegalArgumentException("项目code不能为空");
        }
        this.lambdaUpdate().in(VersionList::getChartCode, chartCodeList).remove();
    }

    /**
     * 更新版本信息
     *
     * @param versionCode     版本号
     * @param versionUpdateBo 版本更新bo
     */
    @Override
    public void updateVersion(String versionCode, VersionUpdateBo versionUpdateBo) {
        if (ObjectUtils.isEmpty(versionCode)) {
            throw new IllegalArgumentException("版本号不能为空");
        }
        VersionList versionList = this.lambdaQuery().eq(VersionList::getCode, versionCode).one();
        if (ObjectUtils.isEmpty(versionList)) {
            throw new RuntimeException(versionCode + "对应的版本信息不存在");
        }
        versionList.setIntroduce(versionUpdateBo.getIntroduce());
        this.updateById(versionList);
    }
}




